{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Training differentially private pipelines"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We start by importing the required libraries and modules and collecting the data that we need from the [Adult dataset](https://archive.ics.uci.edu/ml/datasets/adult)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import sklearn as sk\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "from diffprivlib import models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = np.loadtxt(\"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data\",\n",
    "                        usecols=(0, 4, 10, 11, 12), delimiter=\", \")\n",
    "y_train = np.loadtxt(\"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data\",\n",
    "                        usecols=14, dtype=str, delimiter=\", \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_test = np.loadtxt(\"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test\",\n",
    "                        usecols=(0, 4, 10, 11, 12), delimiter=\", \", skiprows=1)\n",
    "\n",
    "y_test = np.loadtxt(\"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test\",\n",
    "                        usecols=14, dtype=str, delimiter=\", \", skiprows=1)\n",
    "# Must trim trailing period \".\" from label\n",
    "y_test = np.array([a[:-1] for a in y_test])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pipeline with no privacy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To begin, let's train and test a scikit-learn pipeline without any privacy guarantees. We first use `StandardScaler` to normalise the data to zero mean and unit variance, then use `PCA` to reduce the dimensionality of the system, and then use `LogisticRegression` as a classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "pipe = Pipeline([\n",
    "    ('scaler', sk.preprocessing.StandardScaler()),\n",
    "    ('pca', sk.decomposition.PCA(2)),\n",
    "    ('lr', sk.linear_model.LogisticRegression(solver=\"lbfgs\"))\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now train the model, and save the test accuracy as a baseline."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Non-private test accuracy: 80.30%\n"
     ]
    }
   ],
   "source": [
    "pipe.fit(X_train, y_train)\n",
    "baseline = pipe.score(X_test, y_test)\n",
    "print(\"Non-private test accuracy: %.2f%%\" % (baseline * 100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Differentially private pipeline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using `diffprivlib`, we can now train a differentially private pipeline. We use the same components as in our pipeline above, but with each component satisfying differential privacy. We decide on the `bounds` and `data_norm` parameters by trial and error for this example. In practice, these hyperparameters should be chosen using non-sensitive data, i.e. from metadata provided by the data owner."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Differentially private pipeline accuracy (epsilon=3): 81.14%\n"
     ]
    }
   ],
   "source": [
    "dp_pipe = Pipeline([\n",
    "    ('scaler', models.StandardScaler(bounds=([17, 1, 0, 0, 1], [90, 160, 10000, 4356, 99]))),\n",
    "    ('pca', models.PCA(2, data_norm=5, centered=True)),\n",
    "    ('lr', models.LogisticRegression(data_norm=5))\n",
    "])\n",
    "\n",
    "dp_pipe.fit(X_train, y_train)\n",
    "print(\"Differentially private pipeline accuracy (epsilon=3): %.2f%%\" % (dp_pipe.score(X_test, y_test) * 100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's now train the pipeline across a range of epsilons."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "epsilons = np.logspace(-3, 0, 500)\n",
    "pipe_accuracy = []\n",
    "\n",
    "for epsilon in epsilons:\n",
    "    _eps = epsilon / 3\n",
    "    dp_pipe.set_params(scaler__epsilon=_eps, pca__epsilon=_eps, lr__epsilon=_eps)\n",
    "    \n",
    "    dp_pipe.fit(X_train, y_train)\n",
    "    pipe_accuracy.append(dp_pipe.score(X_test, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's save the results so they can be used later."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "\n",
    "pickle.dump((epsilons, baseline, pipe_accuracy), open(\"pipeline_accuracy_500.p\", \"wb\" ) )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now plot the results, showing that non-private accuracy is matched from approximately `epsilon = 0.1`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import pickle\n",
    "\n",
    "epsilons, baseline, pipe_accuracy = pickle.load(open(\"pipeline_accuracy_500.p\", \"rb\"))\n",
    "\n",
    "plt.semilogx(epsilons, pipe_accuracy, label=\"Differentially private pipeline\", zorder=10)\n",
    "plt.plot(epsilons, np.ones_like(epsilons) * baseline, dashes=[2,2], label=\"Non-private pipeline\", zorder=5)\n",
    "plt.title(\"Differentially private pipeline accuracy\")\n",
    "plt.xlabel(\"epsilon\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.ylim(0, 1)\n",
    "plt.xlim(epsilons[0], epsilons[-1])\n",
    "plt.legend(loc=4)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
